package modele.coupSpecial;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import modele.Plateau;
import modele.case_.Case;
import modele.pion.terrestre.Clone;
import outils.Outils;
import outils.gestionnairefichier.GestionnaireImage;
import vue.Camera;

/**
 * Représente un coup spécial clonant le pion
 *
 * @author zianechm
 */
public class Clonage extends CoupSpecial {

	private double portee;

	/**
	 * Crée un coup spécial Clonage
	 *
	 * @param portee
	 */
	public Clonage(double portee) {
		super();
		this.portee = portee;
		afficherCasesAffectees = true;
	}

	/**
	 * Clone le pion possédant cette attaque spéciale dans la case cible
	 *
	 * @param p
	 */
	protected void clonage(Plateau p) {
		Clone clone = ((Clone) lanceur).creerClone(cible);
		cible.setPion(clone);
		clone.getJoueur().getPions().add(clone);
		setCoupSpecialDispo(false);
	}

	@Override
	public void effectuerCoupSpecial(Plateau p) {
		if (estCibleValide()) {
			clonage(p);
		}
	}

	@Override
	public ArrayList<Case> porteeCoupSpecial(Plateau p) {
		ArrayList<Case> cases = new ArrayList<Case>();
		ArrayList<Case> casesASupprimer = new ArrayList<Case>();
		cases = Outils.cercle(lanceur.getCase(), p, portee);
		for (Case c : cases) {
			if (!lanceur.peutAcceder(c) || c.getPion() != null) {
				casesASupprimer.add(c);
			}

		}
		cases.removeAll(casesASupprimer);
		return cases;
	}

	@Override
	public void dessiner(Graphics2D gr, Camera camera) {
		if (estCibleValide()) {
			BufferedImage bi = GestionnaireImage.getInstance().get("src/donnees/images/Clone.png");
			gr.drawImage(bi, null, cible.getX() * Plateau.TAILLE_CASE, cible.getY() * Plateau.TAILLE_CASE);
		}
	}

	/*
	 * @return vrai si la cible est une cible valide, faux sinon
	 */
	private boolean estCibleValide() {
		return lanceur.peutAcceder(cible) && cible.getPion() == null && (cible.getX() - lanceur.getX()) * (cible.getX() - lanceur.getX()) + (cible.getY() - lanceur.getY()) * (cible.getY() - lanceur.getY()) <= ((portee - 0.9) * (portee - 0.9));
	}
}
